﻿using SqlSugar;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


namespace Zhaoxi.SqlSugarAdvanced.SaasSubDatabase
{
    // <summary>
    /// 数据库管理
    /// </summary>
    public class DbMangerFatory
    {
        private string configId;
        public DbMangerFatory(string ConfigId)
        {
            configId = ConfigId;
        } 
        /// <summary>
        /// 获取业务库对象 （用IOC这块代码不能写到IOC里面）
        /// </summary>
        public ISqlSugarClient BizDb
        {
            get
            {
                if (!Db.IsAnyConnection(configId))
                {
                    //用非默认ConfigId进行测试
                    //添加业务库只在当前上下文有效（原理：SqlSugarScope模式入门文档去看）
                    Db.AddConnection(new ConnectionConfig()
                    {
                        ConfigId = configId,
                        ConnectionString = "",
                        DbType = DbType.SqlServer,
                        IsAutoCloseConnection = true
                    });
                }
                //原理说明
                //IsAnyConnection、AddConnection和GetConnection 都是Scope周期不同请求不会有影响 
                var result = Db.GetConnection(configId);
                //可以给业务库result设置AOP
                return result;
            }
        }

        public ISqlSugarClient BizDbNew
        {
            get
            {
                //根据Token获取用户信息和连接字符串信息  
                if (!Db.IsAnyConnection(configId))
                {
                    //用非默认ConfigId进行测试
                    //添加业务库只在当前上下文有效（原理：SqlSugarScope模式入门文档去看）
                    Db.AddConnection(new ConnectionConfig()
                    {
                        ConfigId = configId,
                        ConnectionString = "",
                        DbType = DbType.SqlServer,
                        IsAutoCloseConnection = true
                    });
                }
                //原理说明
                //IsAnyConnection、AddConnection和GetConnection 都是Scope周期不同请求不会有影响 
                var result = Db.GetConnection(configId);
                //可以给业务库result设置AOP
                return result;
            }
        }

        /// <summary>
        /// 获基础信息库对象 （用IOC这块代码不能写到IOC里面）
        /// </summary>
        public static ISqlSugarClient MasterDb
        {
            get
            {
                //如果是跨服务器分库，也需要动态配置的，因为库的IP会变
                //参考业务库用法
                return Db.GetConnection("default");
            }
        }
        /// <summary>
        /// 
        /// </summary>
        public static SqlSugarScope Db = new SqlSugarScope(new ConnectionConfig()
        {
            ConfigId = "default",
            DbType = DbType.SqlServer,
            ConnectionString = "",
            IsAutoCloseConnection = true
        },
         db =>
         {
             //基础库AOP
             db.Aop.OnLogExecuting = (s, p) =>
             {

             };

             //SQL报错：日志记录 - 执行数序4
             db.Aop.OnError = (exp) =>
             {
                 //exp.sql 这样可以拿到错误SQL，性能无影响拿到ORM带参数使用的SQL 
                 //5.0.8.2 获取无参数化 SQL  对性能有影响，特别大的SQL参数多的，调试使用
                 //UtilMethods.GetSqlString(DbType.SqlServer,exp.sql,exp.parameters) 
                 Console.WriteLine($"Sql执行报错了，异常消息：{exp.Message}");
             };
         });
    }
}
